package net.lucamasini.fantacalcio.gwt.client.presenter;

import java.util.ArrayList;
import java.util.List;

import net.lucamasini.fantacalcio.gwt.client.view.GiocatoriView;
import net.lucamasini.fantacalcio.server.model.Squadra;
import net.lucamasini.fantacalcio.server.service.SquadraServiceAsync;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.view.client.SingleSelectionModel;

public class GiocatoriPresenter implements Presenter {

	private final GiocatoriView view;
	private final SquadraServiceAsync service;
    private final SingleSelectionModel<Squadra> singleSelectionModel = new SingleSelectionModel<Squadra>();
	
    List<Squadra> squadre = new ArrayList<Squadra>();

	public GiocatoriPresenter(GiocatoriView view, SquadraServiceAsync service) {
		
		this.view = view;
		this.service = service;
		
		view.giocatori().setSelectionModel(singleSelectionModel);
	}
	
	@Override
	public void go(HasWidgets container) {
		populate();

		container.clear();
		container.add(view.asWidget());
	}

	public void populate() {
		service.findAllSquadre(new AsyncCallback<List<Squadra>>() {

			@Override
			public void onFailure(Throwable caught) {
				GWT.log("findAllSquadre", caught);
			}

			@Override
			public void onSuccess(List<Squadra> result) {
				
				GiocatoriPresenter.this.squadre = result;
				
				GiocatoriPresenter.this.view.giocatori().setRowData(0, squadre);		
			}
		});
	}
	
	public void creaNuovoGiocatore() {
		Squadra squadra = new Squadra(view.squadra().getValue(), view.username().getValue());
		
		service.creaSquadra(squadra, new AsyncCallback<List<Squadra>>() {
			
			@Override
			public void onSuccess(List<Squadra> squadreNew) {
				view.giocatori().setRowData(0, squadreNew);
				view.squadra().setValue("");
				view.username().setValue("");
			}
			
			@Override
			public void onFailure(Throwable caught) {
				GWT.log("creaNuovoGiocatore", caught);
			}
		});
	}

	public void aggiornaSquadra() {
		service.aggiornaSquadre(squadre, new AsyncCallback<List<Squadra>>() {
			
			@Override
			public void onSuccess(List<Squadra> result) {
				GiocatoriPresenter.this.squadre = result;
				GiocatoriPresenter.this.view.giocatori().setRowData(0, squadre);		
			}
			
			@Override
			public void onFailure(Throwable caught) {
				GWT.log("aggiornaSquadra", caught);
			}
		});
	}

	public void cancellaSquadraSelezionata() {
		if( singleSelectionModel.getSelectedObject()!=null && Window.confirm("Sei sicuro di voler cancellare il giocatore selezionato ??")){
			service.cancellaSquadra(singleSelectionModel.getSelectedObject(), new AsyncCallback<List<Squadra>>() {
				
				@Override
				public void onSuccess(List<Squadra> result) {
					GiocatoriPresenter.this.squadre = result;
					GiocatoriPresenter.this.view.giocatori().setRowData(0, squadre);
					GiocatoriPresenter.this.view.giocatori().setRowCount(result.size());
				}
				
				@Override
				public void onFailure(Throwable caught) {
					GWT.log("cancellaSquadraSelezionata", caught);
				}
			});
		}
	}
}
